home *** CD-ROM | disk | FTP | other *** search
/ Aminet 48 / Aminet 48 (2002)(GTI - Schatztruhe)[!][Apr 2002].iso / Aminet / dev / mui / urltext.lha / Urltext / Sources / mcc / libinit.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-01-25  |  2.8 KB  |  109 lines

  1.  
  2. #include <proto/exec.h>
  3. #include <string.h>
  4. #include "base.h"
  5.  
  6. /****************************************************************************/
  7.  
  8. char author[] = "\0$Author Alfonso Ranieri <alforan@tin.it>";
  9. char libName[] = PRG;
  10. struct UrltextBase *UrltextBase;
  11.  
  12. /****************************************************************************/
  13.  
  14. BOOL ASM initBase(REG(a0) struct UrltextBase *base);
  15. void ASM freeBase(REG(a0) struct UrltextBase *base);
  16.  
  17. /****************************************************************************/
  18.  
  19. struct UrltextBase *SAVEDS ASM
  20. initLib (REG(a0) ULONG segList,REG(a6) APTR SysBase,REG(d0) struct UrltextBase *base)
  21. {
  22.     base->sysBase       = SysBase;
  23.     base->segList       = segList;
  24.     base->dosBase       = NULL;
  25.     base->utilityBase   = NULL;
  26.     base->intuitionBase = NULL;
  27.     base->gfxBase       = NULL;
  28.     base->localeBase    = NULL;
  29.     base->muiMasterBase = NULL;
  30.     base->iFFParseBase  = NULL;
  31.     base->openURLBase   = NULL;
  32.     base->diskFontBase  = NULL;
  33.     base->mcc           = NULL;
  34.     base->cat           = NULL;
  35.     base->flags         = 0;
  36.  
  37.     memset(&base->libSem,0,sizeof(struct SignalSemaphore));
  38.     InitSemaphore(&base->libSem);
  39.  
  40.     return UrltextBase = base;
  41. }
  42.  
  43. /****************************************************************************/
  44.  
  45. struct UrltextBase * SAVEDS ASM
  46. openLib(REG(a6) struct UrltextBase *base)
  47. {
  48.     register struct ExecBase    *SysBase = base->sysBase;
  49.     register struct UrltextBase *res = base;
  50.  
  51.     base->libNode.lib_OpenCnt++;
  52.     base->libNode.lib_Flags &= ~LIBF_DELEXP;
  53.  
  54.     ObtainSemaphore(&base->libSem);
  55.     if (!(base->flags & BASEFLG_INIT))
  56.     {
  57.         if (!initBase(base))
  58.         {
  59.             base->libNode.lib_OpenCnt--;
  60.             res = NULL;
  61.         }
  62.     }
  63.     ReleaseSemaphore(&base->libSem);
  64.  
  65.     return res;
  66. }
  67.  
  68. /****************************************************************************/
  69.  
  70. ULONG SAVEDS ASM
  71. expungeLib(REG(a6) struct UrltextBase *base)
  72. {
  73.     if (!base->libNode.lib_OpenCnt)
  74.     {
  75.         register struct ExecBase    *SysBase = base->sysBase;
  76.         register ULONG              segList = base->segList;
  77.  
  78.         Remove((struct Node *)base);
  79.         FreeMem((UBYTE *)base-base->libNode.lib_NegSize,base->libNode.lib_NegSize + base->libNode.lib_PosSize);
  80.  
  81.         return segList;
  82.     }
  83.  
  84.     base->libNode.lib_Flags |= LIBF_DELEXP;
  85.  
  86.     return NULL;
  87. }
  88.  
  89. /****************************************************************************/
  90.  
  91. ULONG SAVEDS ASM
  92. closeLib(REG(a6) struct UrltextBase *base)
  93. {
  94.     if (!--base->libNode.lib_OpenCnt)
  95.     {
  96.         register struct ExecBase *SysBase = base->sysBase;
  97.  
  98.         ObtainSemaphore(&base->libSem);
  99.         freeBase(base);
  100.         ReleaseSemaphore(&base->libSem);
  101.  
  102.         if (base->libNode.lib_Flags & LIBF_DELEXP) return expungeLib(base);
  103.     }
  104.  
  105.     return NULL;
  106. }
  107.  
  108. /****************************************************************************/
  109.